﻿// Copyright (c) 2012 Mokah Nnamezie & Andrew Cooper
// Neo4Net graph database - http://neo4net.codeplex.com
//
// This file is part of Neo4Net - a .Net port of the Neo4j graph database
//
// Neo4Net is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

namespace Neo4Net.Kernel.Impl.Core
{
    using System;
    using System.Collections.Generic;
    using Neo4Net.GraphDb;
    using Neo4Net.GraphDb.Factory;
    using Neo4Net.Kernel.Impl;

    public class ProduceNonCleanDefraggedStringStore
    {
        public static void Main(String[] args)
        {
            IGraphDatabaseService db = new GraphDatabaseFactory().NewEmbeddedDatabase(args[0]);

            // Create some strings
            IList<INode> nodes = new List<INode>();
            ITransaction tx = db.BeginTx();
            try
            {
                INode previous = null;
                for (int i = 0; i < 20; i++)
                {
                    INode node = db.CreateNode();
                    node.SetProperty("name", "a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong string");
                    nodes.Add(node);
                    if (previous != null)
                        previous.CreateRelationshipTo(node, MyRelTypes.Test);
                    previous = node;
                }
                tx.Success();
            }
            finally
            {
                tx.Finish();
            }

            // Delete some of them, but leave some in between deletions
            tx = db.BeginTx();
            try
            {
                Delete(nodes[5]);
                Delete(nodes[7]);
                Delete(nodes[8]);
                Delete(nodes[10]);
                tx.Success();
            }
            finally
            {
                tx.Finish();
            }

            // Non-clean "shutdown"
            Environment.Exit(0);
        }

        private static void Delete(INode node)
        {
            foreach (IRelationship rel in node.GetRelationships())
                rel.Delete();
            node.Delete();
        }
    }
}
